﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Text;
using TicketsPhone.Web.Models;
using TicketsPhone.Domain.Entities;

namespace System.Web.Mvc.Html
{
    public static class HtmlHelperExtensions
    {

        public static string ObtenerNombreControl(HtmlHelper html) { return html.ViewContext.Controller.ControllerContext.RouteData.Values["Controller"].ToString(); }
        
        /// <summary>
        /// Muestra un label con un mensaje cuando el parametro mostrartexto esta en true
        /// </summary>
        /// <param name="mostrarTexto">cuando esta en true meustra los datos</param>
        /// <param name="texto">texto a mostrar</param>
        /// <param name="estilos">caracteristicas adicionales del estilo</param>
        /// <param name="class">propiedad class del span</param>
        /// <returns>Span con las caracteristicas enviadas</returns>
        public static MvcHtmlString LabelTrue(this HtmlHelper html, bool mostrarTexto, string texto, string estilos=null, string @class = null)
        {
            if (mostrarTexto)
                return MvcHtmlString.Create(string.Format("<span class='{0}' style='{1}'>{2}</span>", @class, estilos, texto));
            else
                return MvcHtmlString.Create(string.Empty);
        }

        /// <summary>
        /// Retorna el HTML de una imagen con la URL respectiva
        /// </summary>
        /// <param name="ruta">ruta de la imagen que se desea cargar</param>
        /// <returns></returns>
        public static MvcHtmlString Imagen(this HtmlHelper html, string ruta, AtributosHtml atributosHtml = null)
        {
            StringBuilder strHtml = new StringBuilder();
            if (atributosHtml != null)
            {
                foreach (var atributo in atributosHtml)
                {
                    strHtml.Append(string.Format("{0}=\"{1}\"", atributo.Key, atributo.Value));
                }
            }
            return MvcHtmlString.Create(string.Format("<img src=\"{0}\" {1}>", ruta, strHtml.ToString()));
        }

        /// <summary>
        /// Retorna el HTML de una imagen con la URL respectiva y con un link
        /// </summary>
        /// <param name="ruta">ruta de la imagen que se desea cargar</param>
        /// <param name="link">Link al que se va direccionar</param>
        /// <returns></returns>
        public static MvcHtmlString ImagenLink(this HtmlHelper html, string ruta, string link, AtributosHtml atributosHtml = null)
        {
            StringBuilder strHtml = new StringBuilder();

            if (atributosHtml != null)
            {
                foreach (var atributo in atributosHtml)
                {
                    strHtml.Append(string.Format("{0}=\"{1}\"", atributo.Key, atributo.Value));
                }
            }
            return MvcHtmlString.Create(string.Format("<a href=\"{0}'><img src=\"{1}\" border=\"0\" {2}></a>", link, ruta, strHtml.ToString()));
        }

        /// <summary>
        /// Crea la cadena de un span oculto con un mensaje para mostrar
        /// </summary>
        /// <param name="texto">texto que se le muestra al usaurio</param>
        /// <param name="id">identificador del span</param>
        /// <returns>cadena con el span</returns>
        public static MvcHtmlString ValidadorOculto(this HtmlHelper html, string texto, string id)
        {
            return MvcHtmlString.Create(string.Format("<span class='field-validation-error' id='{0}' style='display:none' >{1}</span>", id, texto));
        }

        /// <summary>
        /// Muestra un mensaje de edición
        /// </summary>
        /// <param name="id">id del objeto que se desea editar</param>
        public static MvcHtmlString Editar(this HtmlHelper html, int? id)
        {
            if (SesionModel.TienePermiso(ObtenerNombreControl(html), TipoPermiso.Editar))
            {
                return html.ActionLink("Editar", "Editar", new { id = id });    
            }
            else
            {
                return MvcHtmlString.Create("Editar");
            }
        }

        /// <summary>
        /// Muestra un mensaje de borrado
        /// </summary>
        /// <param name="id">id del objeto que se desea borrar</param>
        public static MvcHtmlString Eliminar(this HtmlHelper html, int? id)
        {
            if (SesionModel.TienePermiso(ObtenerNombreControl(html), TipoPermiso.Eliminar))
            {
                return html.ActionLink("Eliminar", "Eliminar", new { id = id }, new { onclick = "return confirm('¿Seguro desea eliminar este registro?')" });
            }
            else
            {
                return MvcHtmlString.Create("Eliminar");
            }
        }

        /// <summary>
        /// Muestra un mensaje de Creacion
        /// </summary>
        public static MvcHtmlString Crear(this HtmlHelper html)
        {
            if (SesionModel.TienePermiso(ObtenerNombreControl(html), TipoPermiso.Crear))
            {
                return html.ActionLink("Crear", "Crear");
            }
            else
            {
                return MvcHtmlString.Create("Crear");
            }
        }

        /// <summary>
        /// Muestra el buscador basico
        /// </summary>
        public static MvcHtmlString Buscador(this HtmlHelper html)
        {
            StringBuilder strHtml = new StringBuilder();
            string link = string.Format("Buscador('?{0}')", TicketsPhone.Web.Utils.Utilidades.AgregarAQueryString("buscador", "{0}"));
            strHtml.Append("<div class='buscarBox'>");
            strHtml.Append(@html.Crear().ToHtmlString());
            strHtml.Append("| Buscar: ");
            strHtml.Append(@html.TextBox("Buscador", HttpContext.Current.Request.QueryString["buscador"]));
            strHtml.Append(@html.Imagen("/Content/themes/tickets/images/btBuscar_03.gif",  new AtributosHtml(TipoAtributoHtml.onclick, link)));
            strHtml.Append("</div>");
            return MvcHtmlString.Create(strHtml.ToString());
        }

        /// <summary>
        /// Retorna la estructura de un paginador
        /// </summary>
        /// <param name="paginador">Modelo que contiene la información del paginador actual</param>
        /// <returns>Html con el contenido del paginador</returns>
        public static MvcHtmlString Paginador(this HtmlHelper html, TicketsPhone.Web.Models.PaginadorModel paginador)
        {
            System.Text.StringBuilder strHtml = new Text.StringBuilder();

            strHtml.Append("<div class='paginacion'>");
            strHtml.Append(string.Format("<div style='float:right; width:70%; text-align:right;'>P&aacute;gina {0} de {1} | ", paginador.PaginaActual, paginador.NumeroPaginas));

            for (int i = 1; i < paginador.NumeroPaginas+1; i++)
			{
                if (i == paginador.PaginaActual)
                {
                    strHtml.Append(string.Format(" {0}", i));
                }
                else
                {
                    strHtml.Append(string.Format(" <a href='?{0}'>{1}</a>", TicketsPhone.Web.Utils.Utilidades.AgregarAQueryString("pag", i.ToString()), i));    
                }
                
			}

            strHtml.Append("</div></div>");

            return MvcHtmlString.Create(strHtml.ToString());
        }

        /// <summary>
        /// Muestra tres listas que forman un calendario
        /// </summary>
        /// <param name="html"></param>
        /// <param name="control"></param>
        /// <returns></returns>
        public static MvcHtmlString Calendario(this HtmlHelper html, string control)
        {
            System.Text.StringBuilder strHtml = new Text.StringBuilder();

            strHtml.Append("<div>");

            strHtml.AppendFormat("Fecha {0}:", control);

            strHtml.AppendFormat("<select id='ddlAnio_{0}' onchange='CargarFecha_{0}()'>", control);

            for (int anio = 1990; anio < 2020; anio++)
            {
                string selected = string.Empty;
                if (HttpContext.Current.Request[string.Format("ddlAnio_{0}", control)] != null && HttpContext.Current.Request[string.Format("ddlAnio_{0}", control)].ToString().Equals(anio.ToString()))
                    selected = "selected";
                
                strHtml.AppendFormat("<option {1}>{0}</option>", anio, selected);
            }

            strHtml.Append("</select>");


            strHtml.AppendFormat("<select id='ddlMes_{0}' onchange='CargarFecha_{0}()'>", control);

            for (int mes = 1; mes < 13; mes++)
            {
                string selected = string.Empty;
                if (HttpContext.Current.Request[string.Format("ddlMes_{0}", control)] !=null && HttpContext.Current.Request[string.Format("ddlMes_{0}", control)].Equals(mes.ToString()))
                    selected = "selected";
                
                strHtml.AppendFormat("<option {1}>{0}</option>", mes, selected);
            }

            strHtml.Append("</select>");


            strHtml.AppendFormat("<select id='ddlDia_{0}' onchange='CargarFecha_{0}()'>", control);

            for (int dia = 1; dia < 31; dia++)
            {

                string selected = string.Empty;
                if (HttpContext.Current.Request[string.Format("ddlDia_{0}", control)] != null && HttpContext.Current.Request[string.Format("ddlDia_{0}", control)].Equals(dia.ToString()))
                    selected = "selected";

                strHtml.AppendFormat("<option {1}>{0}</option>", dia, selected);
            }

            strHtml.Append("</select>");

            strHtml.AppendFormat("<div><input type='hidden' name='txtFecha_{0}' id='txtFecha_{0}'/></div>", control);
            strHtml.Append("<script>");
            strHtml.AppendFormat("function CargarFecha_{0}()\n", control);
            strHtml.Append("{\n");
            strHtml.AppendFormat("$$('txtFecha_{0}').value = $$('ddlAnio_{0}').value+'/'+$$('ddlMes_{0}').value+'/'+$$('ddlDia_{0}').value;\n", control);
            strHtml.Append("}\n");
            strHtml.AppendFormat("</script>");

            strHtml.Append("</div>");

            return MvcHtmlString.Create(strHtml.ToString());

        }

        #region Grillas


        /// <summary>
        /// Pone el COMIENZO del HTML de la grilla más pequeña que contiene la aplicación. En este metodo muestra cabecera y columnas
        /// </summary>
        /// <param name="titulo">Titulo de la Grilla</param>
        /// <param name="ancho">Ancho en pixeles que tiene la grilla</param>
        /// <param name="columnas">listado de nombres de las columnas</param>
        /// <returns>HTML del comienzo de la grilla</returns>
        public static MvcHtmlString ComenzarGrillaSecundaria(this HtmlHelper html, string titulo, int ancho, params string[] columnas)
        {
            System.Text.StringBuilder strHtml = new Text.StringBuilder();

            strHtml.AppendFormat("<div class='tabla3' style='width: {0}px'><div class='tabla3Top'><span>{1}</span></div><div class='tabla3Inner'>", ancho, titulo);
            strHtml.Append("<table width='100%' border='0' cellpadding='0' cellspacing='1'><tr>");
            
            foreach (var col  in columnas)
	        {		        
                strHtml.AppendFormat("<td width='22%' class='tabla3Fila1' align='center'>{0}</td>", col);
	        }                    
                                    
            strHtml.Append("</tr>");

            return MvcHtmlString.Create(strHtml.ToString());
        }

        /// <summary>
        /// Renderiza el HTML de CIERRE de la grilla pequeña de la aplicación
        /// </summary>
        /// <returns></returns>
        public static MvcHtmlString FinalizarGrillaSecundaria(this HtmlHelper html)
        {
            return MvcHtmlString.Create("</table></div><div class='tabla3Btom'><span></span></div></div>");
        }

        #endregion

    }
}
